import time
from django.utils.deprecation import MiddlewareMixin

from userapp.devoprat.models import OperatorLogModel


class OperatorLoggingMiddleware(MiddlewareMixin):
    """自己写的中间建"""

    def __init__(self, *args):
        super().__init__(*args)
        self.start_time = None  # 记录访问时间
        self.flag = False  # 是否记录日至 ，如果用户没有登陆，则不用记录
        self.id = id  # 当前操作的ID

    # process_request请求方法处理所有请求 都会走这个方法
    # process_response响应方法处理所有响应 都会走这个方法
    def process_request(self, request):
        # 初始化时间 记录最开始的时间
        self.start_time = time.time()
        # 客户端IP地址
        ip = request.META.get('REMOTE_ADDR')
        # 请求方式
        method = request.method
        # 请求路径
        path = request.path
        try:
            # 记录用户是不是登陆了，如果没有登陆就不用记录用户的操作
            user_name = request.user.username
        except Exception as e:
            user_name = None
        # 如果有用户登录，则需要记录操作日志。
        if user_name:
            # 这里我们只能拿到用户的名字，ip  请求路径 请求方式
            ol = OperatorLogModel.objects.create(ip_addr=ip, user_name=user_name, method=method, path=path)
            self.flag = True
            self.id = ol.id

    def process_response(self, request, response):
        """相应返回用户数据"""
        # 如果flag是False不用记录
        if not self.flag:
            return response
        # 获取响应类型 Content-Type
        response_type = response.headers.get('Content-Type')
        #  获取响应状态码
        status = response.status_code
        # 结束时间
        end_time = time.time()
        # 获取总共消耗的时间我们用结束时间减去开始时间
        access_time = end_time - self.start_time
        # 视图函数执行了多长时间
        operate_time = round(access_time * 1000)  # 单位是：毫秒
        # 获取到用户的数据，我们给没有获取到值的字段副值
        oplog = OperatorLogModel.objects.get(pk=self.id)
        # 状态码
        oplog.status = status
        # 执行函数消耗的时间
        oplog.duration = operate_time
        # 响应类别
        oplog.response_type = response_type
        if status < 400:
            # 状态码小于400就是操作成功
            oplog.is_success = True
        oplog.save()
        return response
